Akamai 安全情報團隊最近發現了一起針對大量網站(包括食品和零售業巨頭)的 Magecart 網路竊取活動。攻擊之所以備受關注,是因為攻擊者使用了高級遮掩技術——篡改網站的默認404 錯誤頁面 來隱藏惡意程式碼,從而大幅增加了偵測和緩解的難度。
攻擊手法:利用404頁面隱藏惡意程式碼 攻擊者通過入侵網站篡改了 404頁面,使其成為惡意程式碼的載體。這樣的篡改不易被察覺,因為 404頁面通常被視為網站的非關鍵部分,安全團隊容易忽視其可能存在的威脅。這讓攻擊者能夠在網站上持續部署和運行惡意程式碼,並進行用戶資料的竊取,尤其是針對支付信息和個人識別信息(PII)。
加入Client-Side Protection & Compliance,防範每一次使用者資料外泄!
符合 PCI DSS v4.0 標準,助您嚴防網站惡意程式碼和漏洞!
我們一起來看看攻擊者是如何用“404頁面”來搞事情的,以及在面對這些層出不窮的攻擊方式時,企業應採取怎樣的應對措施。
一、全新的攻擊活動
最近,許多地區流行的網站,尤其是食品和零售行業的企業網站,遭遇了一場複雜且隱秘的Magecart網路竊取攻擊。Akamai發現,這些攻擊已持續數周,甚至更長時間。攻擊者採用了一種前所未見的高級遮掩技術,讓惡意程式碼難以被發現和偵測。
Magecart攻擊最開始通常會利用目標網站的漏洞或感染這些網站使用的協力廠商服務。在此次攻擊中,我們檢測到的所有受害網站都直接受到了攻擊,因為惡意程式碼片段被注入到它們的第一方資源中。某些情況下,惡意程式碼會被插入到HTML頁面中;其他情況下,則被隱藏在作為網站一部分所載入的第一方腳本中。
與許多其他Magecart攻擊活動類似,此次攻擊活動的攻擊基礎設施由三個主要部分組成:載入器(Loader)、惡意攻擊代碼(Malicious Code)和資料外泄(Data exfiltration)(圖1)。
載入器:簡短、晦澀的JavaScript代碼片段,負責載入攻擊的完整惡意程式碼。
惡意攻擊代碼:主JavaScript代碼,執行攻擊:檢測敏感輸入,讀取資料,干擾結帳流程,注入偽造表單。
數據外泄:用於將竊取的資料傳輸到攻擊者的命令控制(C2)伺服器的方法
圖1:Magecart的攻擊基礎設施
將攻擊分為三部分,這樣做的目的是以一種更難以檢測的方式來隱藏自己。這樣,只有在攻擊者打算執行的具體目標頁面上才能啟動完整的攻擊流程。這是因為攻擊者使用了混淆措施,只有在攻擊者打算執行的地方才能啟動完整攻擊流程。這也使得攻擊更謹慎,也更難以被受攻擊網站上可能存在的安全服務和外部掃描工具檢測到。
攻擊者通過混淆技術使完整攻擊流程僅在特定目標頁面上啟動,讓攻擊更難被安全系統偵測。這種高級遮掩技術使得攻擊行為更隱蔽,也延長了攻擊持續時間。
二、攻擊活動的三種變體
我們發現了這個攻擊活動的三種不同變體,下文將介紹攻擊的演變以及攻擊者隨時間推移在防範偵測和緩解此類攻擊方面所做的改進:
前兩種變體相當類似,只在載入器部分有細微差異。
第三個版本是獨特的,因為攻擊者使用了網站的預設404錯誤頁面來隱藏他們的惡意程式碼;這是一種我們前所未見的新穎遮掩技術。
接下來,就讓我們一起更深入地看看這個新型攻擊活動三個變體的技術細節。
· 變體一
我們最開始發起這項研究,是因為我們的威脅情報監控工具檢測到在一個大型企業客戶網站上出現了一些可疑代碼片段。分析了這些片段後,我們發現它們是惡意的JavaScript載入器,而這些載入器在網站上仍然存在且活躍。這一發現推動我們進一步調查,進而揭示了整個攻擊活動及其對很多網站的影響。
變體一的載入器:冰山一角
竊取者成功地將一個格式錯誤的HTML圖像標籤(圖2)注入到被攻擊網站。此屬性包含一個經過混淆,Base64編碼的惡意載入器代碼片段。圖像標籤中刻意留空的src屬性旨在阻止網路請求並觸發內聯的onerror回檔,而該回檔中就包含了經過混淆的惡意JavaScript代碼片段。
使用圖像標籤來執行JavaScript代碼是一種較不常見且更複雜的技術。它可以幫助竊取者規避諸一些安全措施(例如分析網路流量的外部掃描器),使其在這種特定情況下不被觸發。經過混淆的代碼將在頁面的上下文中執行,並且會像是由頁面自身啟動的本地第一方腳本那樣運行。
圖2:變體一的載入器,一個格式錯誤的HTML圖像標籤,帶有一個包含惡意載入器代碼的onerror屬性
解碼後的載入器代碼——運行時
一旦在運行時執行了經過混淆(Base64編碼)的代碼,它將變成純粹的JavaScript,並負責啟動一個WebSocket通道(圖3)。這個通道充當了流覽器和攻擊者C2伺服器之間的雙向通信鏈路。
在最近幾場Magecart攻擊活動中,我們都觀察到了WebSocket的使用。WebSocket被認為是一種更安靜、靈活的通信方法,允許攻擊者在單個網路通道上執行各種操作。這也包括從C2伺服器向流覽器發送攻擊的不同部分(反之亦然),以及在某些情況下推動資料外泄活動。
代碼中另一個值得注意的方面是爬蟲檢測,它會檢查使用者代理是否處於自動化控制之下。如果是這種情況,代碼將終止執行。這是一個巧妙的反爬蟲技術,旨在避開可能會檢測到攻擊的外部安全掃描器和沙箱。
圖3:變體一載入器的運行時解碼JavaScript代碼
WebSocket通信流程
一旦建立WebSocket通道,將有第一條消息從攻擊者的C2伺服器發送到流覽器。這條消息以Base64編碼的字串形式傳輸,其中包含一個一行的JavaScript命令,指示流覽器將當前頁面的URL發送回去。
這一步的目的是讓C2伺服器能夠確定當前頁面是結帳(敏感)頁面還是其他非結帳頁面。這樣,攻擊者就可以酌情調整後續步驟。
這種簡單的伺服器端驗證使得攻擊者能夠僅在相關目標頁面上啟動攻擊,從而避免在非敏感頁面上潛在的暴露。這也是一個很好的例子,讓我們知道了為逃避安全服務和外部掃描器的檢測,竊取者都付出了怎樣的努力。
當C2伺服器發現結帳頁面的URL後,流程將繼續到下一個階段。在此階段,C2伺服器會向流覽器發送另一條消息。這是一個長的Base64編碼字串,其中包含整個攻擊代碼。一旦解碼,將得到一個冗長且經過混淆的JavaScript代碼(圖4)。
此代碼負責在目標敏感頁面上執行各種惡意活動,其目的是讀取使用者的敏感個人資訊和信用卡資料,並將其傳輸回竊取者的C2伺服器。
隨後,由惡意程式碼收集的敏感性資料會經過混淆,從流覽器發送到C2伺服器。如上文所述,使用相同的WebSocket通道既載入完整的惡意程式碼又外泄竊取的資料,使得該過程比傳統通信方法(如XHR、fetch或HTML資源請求)更隱蔽,涉及的網路請求更少。
圖4:結帳頁面上的WebSocket流程
· 變體二
變體二的載入器:新瓶裝舊酒
變體一和變體二之間的主要區別在於載入器元件。在變體二中,竊取者插入了一個內聯腳本,其中包含一個代碼片段,它與Meta
Pixel代碼片段非常相似,後者是一個眾所周知的Facebook訪客活動跟蹤服務,其中還包含了一些額外的代碼行(圖5)。
這些添加的代碼行才是實際的載入器,而包裹Meta
Pixel代碼的代碼只是一個誤導性的掩蓋,使其看起來像是一個合法且不可疑的代碼片段。
這種遮掩技術使惡意程式碼片段看起來像是Google Tag
Manager或Facebook等眾所周知的服務,這在最近的Magecart攻擊活動中越來越受歡迎。它使得竊取者能有效逃避外部掃描器和研究人員的靜態分析。
圖5:變體二的載入器,內聯腳本偽裝成Meta Pixel代碼片段,其中包含一個惡意載入器
請求一個圖像
當Akamai仔細檢查Meta
Pixel代碼片段中的可疑代碼行時,發現它似乎會從網站自己的目錄中獲取一個PNG圖像。這個網路請求似乎是對網站上託管的一個無害圖像產生的典型請求,然而當我們檢查了該圖像的實際內容後發現,很明顯這並不像看上去那樣無害(圖6)。
圖6:對攻擊者篡改並包含惡意程式碼的圖像發起了網路圖像請求
圖像二進位檔案中隱藏的惡意JavaScript代碼片段
在這個PNG圖像的二進位資料中,我們發現在二進位檔案的末尾附加了一個Base64編碼的字串(圖7)。隨後提取並解碼該字串,由載入器代碼片段執行(圖8)。解碼後的字串代表一個與變體一載入器的onerror屬性中發現的代碼片段相同的JavaScript代碼片段。
流程的後續步驟與變體一相同。此代碼片段在運行時變成純粹的JavaScript代碼,代碼啟動WebSocket通道,經此連接到攻擊者的C2伺服器,其餘的步驟就和變體一完全相同了。
圖7:包含隱蔽惡意程式碼的圖像二進位資料
圖8:解碼後發現以Base64編碼並隱藏在圖像中的惡意程式碼
· 變體三
接下來到了最精彩的地方了。雖然類似的攻擊早已有之,但這次卻是獨特的。這讓我們感到非常驚訝。
變體三的載入器:看似相同,實則完全不同
乍看起來,這個載入器似乎與變體二的載入器相似,但實際上完全不是這樣。在某些情況下,這個載入器會被偽裝成Meta
Pixel代碼片段,就像在變體二中看到的那樣(圖9);但在其他情況下,它會被注入到頁面上隨機的內聯腳本中(圖10)。
該載入器的一個顯著特點是:對一個名為‘icons’的相對路徑發起一個fetch請求。
圖9:變體三的載入器,包含在偽裝成Meta Pixel代碼片段中的惡意程式碼
圖10:變體三的載入器,包含在隨機內聯腳本中的惡意程式碼片段
404錯誤?開什麼玩笑!
載入器執行後,攻擊活動會向/icons發起一個fetch請求,這是一個實際並不存在的相對路徑。這個請求導致了一個“404未找到”錯誤(圖11)。在分析返回的響應所包含的HTML時,我們發現它似乎是網站的預設404頁面(圖12)。這讓我們感到困惑,我們想知道竊取者是否依然活躍於我們所調查的受害網站上。
圖11:由載入器發起的到不存在路徑的請求,返回了404錯誤
圖12:預設錯誤頁HTML
永遠不要低估載入器
我們退後一步重新分析了載入器,這次終於發現了拼圖中最後缺失的那部分。該載入器包含了一個對字串“COOKIE_ANNOT”進行的正則匹配,這個字串應該在作為圖示請求的一部分返回的404錯誤頁面上執行。
因此,我們在返回的404
HTML中搜索了這個字串,並且終於發現了一個隱藏在頁面末尾的備註,其中包含了字串“COOKIE_ANNOT”(圖14)。在這個字串旁邊,連接了一個很長的Base64編碼字串。該編碼字串代表了整個經過混淆的惡意JavaScript攻擊代碼。載入器從備註中提取這個字串,解碼並執行攻擊,該攻擊旨在竊取使用者輸入的個人資訊。
我們類比了對不存在路徑的其他請求,都返回了包含該惡意程式碼備註的相同404錯誤頁面。這些檢查確認了攻擊者成功更改了整個網站的預設錯誤頁面,並將惡意程式碼隱藏在其中!
圖13:載入器變體三,對字串“COOKIE_ANNOT”的正則匹配
圖14:錯誤頁面HTML中隱藏的惡意備註
數據外泄
偽造表單
與變體一和變體二不同,攻擊者在變體三中採用了一種不同(但依然常見)的資料外泄技術:注入假表單(圖15)。當竊取者無法訪問敏感輸入時,通常會使用此技術。
當網站將支付表單放置在協力廠商iframe或外部頁面中的協力廠商支付服務時,可能會發生這種情況。為避免這種情況,攻擊者創建了一個偽造表單,它與原始支付表單非常相似,原始表單會被它覆蓋——這是一種越來越受歡迎的技術。變體三就是這樣竊取資料的。
圖15:惡意程式碼注入的偽造表單
當用戶提交了偽造表單後,惡意程式碼將截取使用者的輸入資料並將其傳輸回竊取者的C2伺服器。
圖16:偽造表單是隱藏的,用戶會被要求重新輸入自己的資訊
包含被盜資料的圖像請求
提交偽造表單會向攻擊者的C2伺服器發起圖像網路請求,在查詢參數中以Base64編碼字串的形式攜帶所有被竊取的個人和信用卡資訊(圖17)。解碼後,該字串將揭示請求的真實意圖,整個攻擊流程也就一目了然了。
圖17:以Base64編碼字串作為查詢參數包含被盜資料的圖像網路請求
變體三種吸取的教訓:404錯誤
這種遮掩技術極具創新性,是我們在以前的Magecart活動中從未見過的。操縱目標網站預設404錯誤頁面的想法可以為Magecart攻擊者提供各種創造性的選擇,以改進自己的隱藏和逃避能力。
截止撰寫本文時,我們分析的一些案例中的惡意載入器已從受影響網站的頁面中刪除。然而,預設404頁面中的惡意注釋卻依然存在,這可能會讓盜取者輕易地重新發起攻擊。同時,這也凸顯了檢測這種方法的複雜性和減輕其影響的重要性。
另一種規避技術是向通往404頁面的第一方路徑發出請求,這種技術可以繞過內容安全性原則頭和其他可能會主動分析頁面上網路請求的安全措施。這無疑是我們最近遇到的最複雜的Magecart策略之一。
Akamai Client-Side Protection & Compliance和盜取者的鬥爭
作為本次研究工作的一部分,針對Akamai Client-Side Protection &
Compliance進行了模擬,我們的解決方案能夠分析運行時JavaScript所執行的行為,從而抵禦JavaScript威脅並減輕用戶端攻擊。
該解決方案成功檢測到了這個複雜的盜取攻擊,並觸發了一個高嚴重性事件,借此用戶可以立即採取緩解措施。在特定網頁上啟用Client-Side
Protection &
Compliance的真實場景中,網站所有者將收到類似圖18所示的警報,這樣他們就可以迅速調查威脅,並即時回應各種緩解方案。
圖18:Client-Side Protection & Compliance在檢測到模擬的盜取者後發出的警報
結論
為逃避檢測和延長攻擊鏈,Magecart攻擊活動一直在不斷演變,並且正變得越來越複雜。在這種情況下,竊取者採用了一種前所未見的遮掩技術,將他們的惡意程式碼隱藏在網站的預設404錯誤頁面中。這一發現突顯了安全研究人員和組織必須持續努力,以保護他們的網站和用戶免受這類竊取活動的影響。
本研究強調的複雜程度應提醒各企業保持警惕,注意網路攻擊載體,並積極尋求新的先進方法來應對這類攻擊。